/*
moo.fx pack, effects extensions for moo.fx.
by Valerio Proietti (http://mad4milk.net) MIT-style LICENSE
for more info visit (http://moofx.mad4milk.net).
Friday, April 14, 2006
v 1.2.4
*/

//smooth scroll
fx.Scroll = Class.create();
fx.Scroll.prototype = Object.extend(new fx.Base(), {
    initialize: function (options) {
        this.setOptions(options);
    },

    scrollTo: function (el) {
        var dest = Position.cumulativeOffset($(el))[1];
        var client = window.innerHeight || document.documentElement.clientHeight;
        var full = document.documentElement.scrollHeight;
        var top = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;
        if (dest + client > full) this.custom(top, dest - client + (full - dest));
        else this.custom(top, dest);
    },

    increase: function () {
        window.scrollTo(0, this.now);
    }
});

//text size modify, now works with pixels too.
fx.Text = Class.create();
fx.Text.prototype = Object.extend(new fx.Base(), {
    initialize: function (el, options) {
        this.el = $(el);
        this.setOptions(options);
        if (!this.options.unit) this.options.unit = "em";
    },

    increase: function () {
        this.el.style.fontSize = this.now + this.options.unit;
    }
});

//composition effect: widht/height/opacity
fx.Combo = Class.create();
fx.Combo.prototype = {
    setOptions: function (options) {
        this.options = {
            opacity: true,
            height: true,
            width: false
        }
        Object.extend(this.options, options || {});
    },

    initialize: function (el, options) {
        this.el = $(el);
        this.setOptions(options);
        if (this.options.opacity) {
            this.o = new fx.Opacity(el, options);
            options.onComplete = null;
        }
        if (this.options.height) {
            this.h = new fx.Height(el, options);
            options.onComplete = null;
        }
        if (this.options.width) this.w = new fx.Width(el, options);
    },

    toggle: function () { this.checkExec('toggle'); },

    hide: function () { this.checkExec('hide'); },

    clearTimer: function () { this.checkExec('clearTimer'); },

    checkExec: function (func) {
        if (this.o) this.o[func]();
        if (this.h) this.h[func]();
        if (this.w) this.w[func]();
    },

    //only if width+height
    resizeTo: function (hto, wto) {
        if (this.h && this.w) {
            this.h.custom(this.el.offsetHeight, this.el.offsetHeight + hto);
            this.w.custom(this.el.offsetWidth, this.el.offsetWidth + wto);
        }
    },

    customSize: function (hto, wto) {
        if (this.h && this.w) {
            this.h.custom(this.el.offsetHeight, hto);
            this.w.custom(this.el.offsetWidth, wto);
        }
    }
}

fx.Accordion = Class.create();
fx.Accordion.prototype = {
    setOptions: function (options) {
        this.options = {
            delay: 100,
            opacity: false
        }
        Object.extend(this.options, options || {});
    },

    initialize: function (togglers, elements, options) {
        this.elements = elements;
        this.setOptions(options);
        var options = options || '';
        this.fxa = [];
        if (options && options.onComplete) options.onFinish = options.onComplete;
        elements.each(function (el, i) {
            options.onComplete = function () {
                if (el.offsetHeight > 0) el.style.height = '1%';
                if (options.onFinish) options.onFinish(el);
            }
            this.fxa[i] = new fx.Combo(el, options);
            this.fxa[i].hide();
        } .bind(this));

        togglers.each(function (tog, i) {
            if (typeof tog.onclick == 'function') var exClick = tog.onclick;
            tog.onclick = function () {
                if (exClick) exClick();
                this.showThisHideOpen(elements[i]);
            } .bind(this);
        } .bind(this));
    },

    showThisHideOpen: function (toShow) {
        this.elements.each(function (el, j) {
            if (el.offsetHeight > 0 && el != toShow) this.clearAndToggle(el, j);
            if (el == toShow && toShow.offsetHeight == 0) setTimeout(function () { this.clearAndToggle(toShow, j); } .bind(this), this.options.delay);
        } .bind(this));
    },

    clearAndToggle: function (el, i) {
        this.fxa[i].clearTimer();
        this.fxa[i].toggle();
    }
}

var Remember = new Object();
Remember = function () { };
Remember.prototype = {
    initialize: function (el, options) {
        this.el = $(el);
        this.days = 365;
        this.options = options;
        this.effect();
        var cookie = this.readCookie();
        if (cookie) {
            this.fx.now = cookie;
            this.fx.increase();
        }
    },

    //cookie functions based on code by Peter-Paul Koch
    setCookie: function (value) {
        var date = new Date();
        date.setTime(date.getTime() + (this.days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
        document.cookie = this.el + this.el.id + this.prefix + "=" + value + expires + "; path=/";
    },

    readCookie: function () {
        var nameEQ = this.el + this.el.id + this.prefix + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; c = ca[i]; i++) {
            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }
        return false;
    },

    custom: function (from, to) {
        if (this.fx.now != to) {
            this.setCookie(to);
            this.fx.custom(from, to);
        }
    }
}

fx.RememberHeight = Class.create();
fx.RememberHeight.prototype = Object.extend(new Remember(), {
    effect: function () {
        this.fx = new fx.Height(this.el, this.options);
        this.prefix = 'height';
    },

    toggle: function () {
        if (this.el.offsetHeight == 0) this.setCookie(this.el.scrollHeight);
        else this.setCookie(0);
        this.fx.toggle();
    },

    resize: function (to) {
        this.setCookie(this.el.offsetHeight + to);
        this.fx.custom(this.el.offsetHeight, this.el.offsetHeight + to);
    },

    hide: function () {
        if (!this.readCookie()) {
            this.fx.hide();
        }
    }
});

fx.RememberText = Class.create();
fx.RememberText.prototype = Object.extend(new Remember(), {
    effect: function () {
        this.fx = new fx.Text(this.el, this.options);
        this.prefix = 'text';
    }
});

//useful for-replacement
Array.prototype.iterate = function (func) {
    for (var i = 0; i < this.length; i++) func(this[i], i);
}
if (!Array.prototype.each) Array.prototype.each = Array.prototype.iterate;

//Easing Equations (c) 2003 Robert Penner, all rights reserved.
//This work is subject to the terms in http://www.robertpenner.com/easing_terms_of_use.html.

//expo
fx.expoIn = function (pos) {
    return Math.pow(2, 10 * (pos - 1));
}
fx.expoOut = function (pos) {
    return (-Math.pow(2, -10 * pos) + 1);
}

//quad
fx.quadIn = function (pos) {
    return Math.pow(pos, 2);
}
fx.quadOut = function (pos) {
    return -(pos) * (pos - 2);
}

//circ
fx.circOut = function (pos) {
    return Math.sqrt(1 - Math.pow(pos - 1, 2));
}
fx.circIn = function (pos) {
    return -(Math.sqrt(1 - Math.pow(pos, 2)) - 1);
}

//back
fx.backIn = function (pos) {
    return (pos) * pos * ((2.7) * pos - 1.7);
}
fx.backOut = function (pos) {
    return ((pos - 1) * (pos - 1) * ((2.7) * (pos - 1) + 1.7) + 1);
}

//sine
fx.sineOut = function (pos) {
    return Math.sin(pos * (Math.PI / 2));
}
fx.sineIn = function (pos) {
    return -Math.cos(pos * (Math.PI / 2)) + 1;
}
fx.sineInOut = function (pos) {
    return -(Math.cos(Math.PI * pos) - 1) / 2;
}